#pragma once

//框架提供的专门服务发布rpc服务的网络对象类
#include "google/protobuf/service.h"
#include <memory>
#include "mprpcapplication.h"
#include "mprpcconfig.h"
#include "muduo/base/Timestamp.h"
#include <muduo/net/TcpServer.h>
#include <muduo/net/TcpConnection.h>
#include <muduo/net/Callbacks.h>
#include <muduo/net/EventLoop.h>
#include <muduo/net/InetAddress.h>
#include<functional>
#include<google/protobuf/descriptor.h>
#include<unordered_map>
#include<string>
#include"rpcheader.pb.h"
#include"logger.h"

class RpcProvider
{
public:
    //这里是框架提供给外部使用的，可以发布rpc方法的函数接口
    void NotifyService(google::protobuf::Service *service);

    //启动rpc服务节点，开始提供rpc远程网络调用服务
    void Run();

private:


    struct ServiceInfo{
        google::protobuf::Service* m_service; //保存服务对象
        std::unordered_map<std::string,  const google::protobuf::MethodDescriptor*> m_mthodMap; //保存服务方法
    };
    std::unordered_map<std::string,ServiceInfo> m_serviceMap; //存储注册成功的服务对象和其服务方法的所有信息
    //组合EventLoop
    muduo::net::EventLoop m_eventLoop;
    //新的socket回调
    void OnConnection(const muduo::net::TcpConnectionPtr &);
    //已建立连接用户的读写实现回调,如果远程有一个rpc服务的调用请求，那么OnMessage方法就会响应
    void OnMessage(const muduo::net::TcpConnectionPtr &,muduo::net::Buffer *,muduo::Timestamp);

    //回调操作，Closure的回调操作（即done->run()的执行函数）,用于序列化rpc的响应和网络发送
    void SendRpcResponse(const muduo::net::TcpConnectionPtr &,google::protobuf::Message* );

};